#include <bits/stdc++.h>
using namespace std;

/*
231. 2 的幂
已解答
简单
相关标签
premium lock icon
相关企业
给你一个整数 n，请你判断该整数是否是 2 的幂次方。如果是，返回 true ；否则，返回 false 。

如果存在一个整数 x 使得 n == 2x ，则认为 n 是 2 的幂次方。

 

示例 1：

输入：n = 1
输出：true
解释：20 = 1
示例 2：

输入：n = 16
输出：true
解释：24 = 16
示例 3：

输入：n = 3
输出：false
 

提示：

-231 <= n <= 231 - 1
*/

// 法一
class Solution {
public:
    bool isPowerOfTwo(int n) {
        // n & (n - 1) == 0 必须正数
        return n > 0 && (n & (n - 1)) == 0;
    }
};

// 法二
class Solution {
public:
    bool isPowerOfTwo(int n) {
        // 必须正数
        if (n <= 0) return false;
        while (n % 2 == 0)  n /= 2;

        return n == 1;
    }
};

// 法三
class Solution {
public:
    bool isPowerOfTwo(int n) {
        // 必须正数
        if (n <= 0) return false;
        if (n == 1)  return true;
        if (n % 2 != 0) return false;

        return isPowerOfTwo(n / 2);
    }
};